home *** CD-ROM | disk | FTP | other *** search
- #!perl -w
- undef;
-
- # MakeDepend
-
- use strict;
-
- use FileHandle;
-
- use SourceList;
- use SCF;
-
- unless (@ARGV) {
- @ARGV = ('--target');
- }
- my %DEFS = (
- 'i' => {OPT => 'incdir'},
- 's' => {OPT => 'srcdir'},
- 't' => {OPT => 'target'},
- incdir => {OPT => 'incdir', ARG => 1, MULTI => 'list'},
- srcdir => {OPT => 'srcdir', ARG => 1, MULTI => 'list'},
- target => {OPT => 'target'},
- scf => {OPT => 'scf'},
- srclist => {OPT => 'srclist'},
- );
- my %OPTS = GetOpts(\%DEFS);
-
- $OPTS{target} and $OPTS{scf} = $OPTS{srclist} = 1;
-
- my @files;
- if ($OPTS{srclist}) {
- my $sources = SourceList::Sources(":Manifest:Source.list");
- push @files, map { $_->{DIR} . $_->{FILE} } @$sources;
- }
- if ($OPTS{scf}) {
- my $SCF = SCF::Read(":Manifest:Imports.scf");
- my %srcdirs = SCF::Collect($SCF, "Sources");
- if ($OPTS{srclist}) {
- foreach my $intf (keys %srcdirs) {
- push @files, map { TargetDir($intf, "Menu") . "Sources:$_" }
- split(' ', $srcdirs{$intf});
- }
- }
- my %incdirs = (SCF::Collect($SCF, "Include"), SCF::Collect($SCF, "SysInclude"));
- push @{$OPTS{incdir}}, map { TargetDir($_, "Menu") . "Includes:" } keys %incdirs;
- }
- push @files, @ARGV;
- MakeDepend(@files);
-
- my %Incs;
-
- sub TargetDir {
- my ($target, $dir) = @_;
- # Assumes MPW environment
- $dir ||= "Menu";
- my $pathname = "$ENV{Boot}Development:$dir:$target";
- my $original = readlink($pathname);
- defined $original or die "Missing alias '$pathname'";
- -d $original or die "Stale alias '$pathname'";
- return $original . ':';
- }
-
- sub GetOpts {
- my ($defs) = @_;
- my %opts;
- my @args;
- while ($_ = shift @ARGV) {
- last if /^--$/;
- if (/^--(\w+)(=?)(.*)/) {
- exists $defs->{$1} or die "$0: unknown option '--$1'";
- my $opt = $defs->{$1}{OPT};
- my $value = $defs->{$opt}{ARG} ? $2 ? $3 : shift @ARGV : undef;
- if ($defs->{$opt}{MULTI}) {
- push @{$opts{$opt}}, $value;
- } else {
- $opts{$opt} = defined $value ? $value : 1;
- }
- } elsif (/^-(\w*)/) {
- my @opts = split '', $1;
- foreach (@opts) {
- exists $defs->{$_} or
- die "qui: unknown option '-$_' in '-$1'";
- my $opt = $defs->{$_}{OPT};
- my $value = $defs->{$opt}{ARG} ? shift @ARGV : 1;
- if ($defs->{$opt}{MULTI} eq 'list') {
- push @{$opts{$opt}}, $value;
- } else {
- $opts{$opt} = defined $value ? $value : 1;
- }
- }
- } else {
- push @args, $_;
- }
- }
- push @args, @ARGV;
-
- @ARGV = @args;
- return %opts;
- }
-
- sub Basename {
- my ($name) = @_;
- $name =~ s/^(?:.*:)?(.+?):?$/$1/;
- return $name;
- }
-
- sub Search {
- my ($filename) = @_;
- $filename =~ /:/ and return $filename;
- foreach (@{$OPTS{incdir}}, @{$OPTS{srcdir}}) {
- s/:?$/:/;
- my $path = $_ . $filename;
- -e $path and return $path;
- }
- return undef;
- }
-
- sub ScanForIncludes {
- my ($file, $src) = @_;
- my $path = Search($file) or die "Missing file '$file' included by '$src'";
- my @includes;
- open FILE, $path or die "Error opening file '$file': ($!)";
- while (<FILE>) {
- /^\s*\#\s*include\s+(.*)/ or next;
- my $include = $1;
- $include =~ /^<[^>]+>/ and next;
- $include =~ /^"([^"]+)"\s*$/ or warn "Bad include: '$_'", next;
- push @includes, $1;
- }
- close FILE or die "Error closing file '$file': ($!)";
- return @includes;
- }
-
- sub LearnIncludes {
- my ($file, $src) = @_;
- return if exists $Incs{Basename($file)};
- my @includes = ScanForIncludes($file, $src);
- $Incs{Basename($file)} = [@includes];
- foreach (@includes) {
- LearnIncludes($_, $file);
- }
- }
-
- sub Unique {
- my @list;
- my $item;
- while ($item = shift) {
- push @list, $item unless grep {$_ eq $item} @list;
- }
- return @list;
- }
-
- sub Deps {
- my ($file) = @_;
- my @incs = @{$Incs{$file}};
- foreach (@incs) {
- push @incs, Deps($_);
- }
- return Unique(@incs);
- }
-
- sub MakeDeps {
- my ($file) = @_;
- LearnIncludes($file, 'ROOT');
- my $base = Basename($file);
- my @deps = Deps($base);
- my ($dfile, $objfile);
- ($dfile = $base) =~ s/\..+?$/.d/;
- ($objfile = $base) =~ s/\..+?$/.o/;
- return join(' ', $dfile, $objfile, ':', $base, @deps);
- }
-
- sub MakeDepend {
- #print "# Make dependencies generated automatically by MakeDepend.\n\n";
- foreach my $pathname (@_) {
- my $deps = MakeDeps($pathname);
- my $base = Basename($pathname);
- (my $dfile = $base) =~ s/\..+?$/.d/;
- my $fh = new FileHandle ":[Dependencies]:$dfile", ">";
- defined $fh or die "Couldn't make new FileHandle";
- print $fh $deps, "\n";
- }
- }
-
-